  | 
     | 
    
Knowledge base
MS SQL-server trigger
The examples given below are based on a minimum
SQL-server version of 7. Use Query analyzer to create the tables and triggers. 
Everything put between <> should be
converted to the name relevant in your application. 
The trigger examples below use only 2
alphanumeric and 1 numeric primary key field. Adapt the script to your specific
needs. 
Creating HEAD and TRB
CREATE TABLE HEAD ( 
            HEADER         NUMERIC NOT NULL, 
            MAXI           NUMERIC NOT NULL, 
            PRIMARY KEY (HEADER)) 
go  
INSERT INTO HEAD VALUES(1,100) 
go 
 
 
CREATE TABLE TRB ( 
            IND            NUMERIC NOT NULL, 
            TABL		      VARCHAR(50) NOT NULL, 
            EVENT          VARCHAR(1) NOT NULL, 
            SK1            VARCHAR(50) NULL, 
            SK2            VARCHAR(50) NULL, 
            SK3            VARCHAR(50) NULL, 
            SK4            VARCHAR(50) NULL, 
            SK5            VARCHAR(50) NULL, 
            NK1            NUMERIC NULL, 
            NK2            NUMERIC NULL, 
            NK3            NUMERIC NULL, 
            NK4            NUMERIC NULL, 
            NK5            NUMERIC NULL, 
            FLD
VARCHAR(50) NULL, 
            PRIMARY KEY (IND)) 
go  
INSERT INTO TRB (IND,TABL,EVENT,SK1) VALUES (1,'Promes','1','Promes') 
go 
 
Remark: The value 100 in the MAXI field of HEAD
should be the real maximum of your circular buffer. Most likely this is even
more then 10000. The insert in TRB is needed because the trigger would fail to
run the first time. 
Creating an insert trigger
CREATE TRIGGER <Trigger
name> on <Table name> for INSERT AS 
DECLARE 
    @realhead	NUMERIC, 
    @in_table	NUMERIC, 
    @maximum	NUMERIC, 
    @sk1		VARCHAR(50), 
    @sk2		VARCHAR(50), 
    @sk3		VARCHAR(50), 
    @sk4		VARCHAR(50), 
    @sk5		VARCHAR(50), 
    @nk1		NUMERIC, 
    @nk2		NUMERIC, 
    @nk3		NUMERIC, 
    @nk4		NUMERIC, 
    @nk5		NUMERIC 
BEGIN 
    set CURSOR_CLOSE_ON_COMMIT on 
    declare <Cursor name> cursor for select
<Alpha field1>,<Alpha
field2>,<Numeric field1> from inserted 
    open <Cursor name> 
    fetch next from <Cursor name>
into @sk1,@sk2,@nk1 
    WHILE (@@FETCH_STATUS <> -1) 
    begin 
        SELECT @realhead = HEADER,@maximum = MAXI FROM HEAD 
        SELECT @in_table = MAX(IND) FROM TRB 
        set @realhead=@realhead+1 
        IF @realhead>@maximum  
        BEGIN 
            set @realhead=1 
        END 
        IF @in_table<@realhead  
        BEGIN 
            INSERT INTO TRB
(IND,TABL,EVENT,SK1,SK2,SK3,SK4,SK5,NK1,NK2,NK3,NK4,NK5) values 
            (@realhead,'<Table
name>','1',@sk1,@sk2,NULL,NULL,NULL,@nk1,NULL,NULL,NULL,NULL) 
            UPDATE HEAD SET HEADER=@realhead 
        END  
        ELSE 
        BEGIN 
            UPDATE TRB SET
IND=@realhead,TABL='<Table name>',EVENT='1',SK1=@sk1, 
            SK2=@sk2,SK3=NULL,SK4=NULL,SK5=NULL,NK1=@nk1,NK2=NULL,NK3=NULL,NK4=NULL,NK5=NULL WHERE IND=@realhead; 
            UPDATE HEAD SET HEADER=@realhead; 
        END 
        fetch next from <Cursor
name> into @sk1,@sk2,@nk1 
    end 
    close <Cursor name> 
    deallocate <Cursor name> 
    commit  
END 
 
GO 
 
Creating an update trigger
CREATE TRIGGER <Trigger
name> on <Table name> for UPDATE AS 
DECLARE 
   	@realhead	NUMERIC, 
   	@in_table	NUMERIC, 
   	@maximum	NUMERIC, 
   	@sk1		VARCHAR(50), 
   	@sk2		VARCHAR(50), 
   	@sk3		VARCHAR(50), 
   	@sk4		VARCHAR(50), 
   	@sk5		VARCHAR(50), 
   	@nk1		NUMERIC, 
   	@nk2		NUMERIC, 
   	@nk3		NUMERIC, 
   	@nk4		NUMERIC, 
   	@nk5		NUMERIC 
BEGIN 
   	set CURSOR_CLOSE_ON_COMMIT on 
   	declare <Cursor name> cursor for select
<Alpha field1>,<Alpha
field2>,<Numeric field1> from inserted 
   	open <Cursor name> 
   	fetch next from <Cursor name> into
@sk1,@sk2,@nk1 
   	WHILE (@@FETCH_STATUS <> -1) 
   	begin 
       			SELECT @realhead = HEADER,@maximum = MAXI FROM HEAD 
       			SELECT @in_table = MAX(IND) FROM TRB 
       			set @realhead=@realhead+1 
       			IF @realhead>@maximum  
       				BEGIN 
           				set @realhead=1 
        END 
       			IF @in_table<@realhead  
       				BEGIN 
           				INSERT INTO TRB
(IND,TABL,EVENT,SK1,SK2,SK3,SK4,SK5,NK1,NK2,NK3,NK4,NK5) values 
            (@realhead,'<Table
name>','2',@sk1,@sk2,NULL,NULL,NULL,@nk1,NULL,NULL,NULL,NULL) 
           				UPDATE HEAD SET HEADER=@realhead 
       				END  
       			ELSE 
       				BEGIN 
           				UPDATE TRB SET
IND=@realhead,TABL='<Table name>',EVENT='2',SK1=@sk1, 
            SK2=@sk2,SK3=NULL,SK4=NULL,SK5=NULL,NK1=@nk1,NK2=NULL,NK3=NULL,NK4=NULL,NK5=NULL WHERE IND=@realhead; 
           				UPDATE HEAD SET HEADER=@realhead; 
       				END 
       		fetch next from <Cursor
name> into @sk1,@sk2,@nk1 
   	end 
   	close <Cursor name> 
   	deallocate <Cursor name> 
   	commit  
END 
 
GO 
 
Creating a delete trigger
CREATE TRIGGER <Trigger
name> on <Table name> for DELETE AS 
DECLARE 
   	@realhead	NUMERIC, 
   	@in_table	NUMERIC, 
   	@maximum	NUMERIC, 
   	@sk1		VARCHAR(50), 
   	@sk2		VARCHAR(50), 
   	@sk3		VARCHAR(50), 
   	@sk4		VARCHAR(50), 
   	@sk5		VARCHAR(50), 
   	@nk1		NUMERIC, 
   	@nk2		NUMERIC, 
   	@nk3		NUMERIC, 
   	@nk4		NUMERIC, 
   	@nk5		NUMERIC 
BEGIN 
   	set CURSOR_CLOSE_ON_COMMIT on 
   	declare <Cursor name> cursor for select
<Alpha field1>,<Alpha
field2>,<Numeric field1> from
deleted 
   	open <Cursor name> 
   	fetch next from <Cursor name> into
@sk1,@sk2,@nk1 
   	WHILE (@@FETCH_STATUS <> -1) 
   	begin 
       			SELECT @realhead = HEADER,@maximum = MAXI FROM HEAD 
       			SELECT @in_table = MAX(IND) FROM TRB 
       			set @realhead=@realhead+1 
       			IF @realhead>@maximum  
       				BEGIN 
           				set @realhead=1 
        END 
       			IF @in_table<@realhead  
       				BEGIN 
           				INSERT INTO TRB
(IND,TABL,EVENT,SK1,SK2,SK3,SK4,SK5,NK1,NK2,NK3,NK4,NK5) values 
            (@realhead,'<Table
name>','3',@sk1,@sk2,NULL,NULL,NULL,@nk1,NULL,NULL,NULL,NULL) 
           				UPDATE HEAD SET HEADER=@realhead 
       				END  
       			ELSE 
       				BEGIN 
           				UPDATE TRB SET
IND=@realhead,TABL='<Table name>',EVENT='3',SK1=@sk1, 
            SK2=@sk2,SK3=NULL,SK4=NULL,SK5=NULL,NK1=@nk1,NK2=NULL,NK3=NULL,NK4=NULL,NK5=NULL WHERE IND=@realhead; 
           				UPDATE HEAD SET HEADER=@realhead; 
       				END 
       		fetch next from <Cursor
name> into @sk1,@sk2,@nk1 
   	end 
   	close <Cursor name> 
   	deallocate <Cursor name> 
   	commit  
END 
 
GO 
 
     | 
      |